//////////////////////////////////////////////////////////////////////////////

//  Utilities

//////////////////////////////////////////////////////////////////////////////

#ifndef	__MAGUS_UTILITY_HPP
#define	__MAGUS_UTILITY_HPP

#include <magus/noncopyable.hpp>

//////////////////////////////////////////////////////////////////////////////

namespace magus
{
	template<int N>
	struct check_power
	{
		enum{ is_power_of_2 = ( N>0 && N%2==0 && check_power<N/2>::is_power_of_2 ) };
		enum{ is_power_of_3 = ( N>0 && N%3==0 && check_power<N/3>::is_power_of_3 ) };
		enum{ is_power_of_5 = ( N>0 && N%5==0 && check_power<N/5>::is_power_of_5 ) };
		enum{ is_power_of_10 = ( N>0 && N%10==0 && check_power<N/10>::is_power_of_10 ) };
	};

	template<>
	struct check_power<10>
	{
		enum{ is_power_of_2 = false };
		enum{ is_power_of_3 = false };
		enum{ is_power_of_5 = false };
		enum{ is_power_of_10 = true };
	};

	template<>
	struct check_power<5>
	{
		enum{ is_power_of_2 = false };
		enum{ is_power_of_3 = false };
		enum{ is_power_of_5 = true };
		enum{ is_power_of_10 = false };
	};

	template<>
	struct check_power<3>
	{
		enum{ is_power_of_2 = false };
		enum{ is_power_of_3 = true };
		enum{ is_power_of_5 = false };
		enum{ is_power_of_10 = false };
	};

	template<>
	struct check_power<2>
	{
		enum{ is_power_of_2 = true };
		enum{ is_power_of_3 = false };
		enum{ is_power_of_5 = false };
		enum{ is_power_of_10 = false };
	};

	template<>
	struct check_power<1>
	{
		enum{ is_power_of_2 = false };
		enum{ is_power_of_3 = false };
		enum{ is_power_of_5 = false };
		enum{ is_power_of_10 = false };
	};

	template<>
	struct check_power<0>
	{
		enum{ is_power_of_2 = false };
		enum{ is_power_of_3 = false };
		enum{ is_power_of_5 = false };
		enum{ is_power_of_10 = false };
	};
}

//////////////////////////////////////////////////////////////////////////////

#endif		// #ifndef	__MAGUS_UTILITY_HPP
